/*
 * $Id: ResinInjectorFactory.java 6 2009-03-20 00:57:43Z scotthernandez $
 * $URL: https://condi-stripes.googlecode.com/svn/ConDI-Stripes/trunk/src/com/googlecode/condistripes/ResinInjectorFactory.java $
 *
 * Copyright 2008-2009 Scott Hernandez
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

package com.googlecode.candistripes;

import java.lang.reflect.InvocationTargetException;

import javax.inject.manager.Manager;

import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.action.ActionBeanContext;
import net.sourceforge.stripes.util.Log;

public class ResinInjectorFactory implements CanDIFactory {

	protected static String DESCRIPTION = "Resin 4.0 March Snap Injectory Factory. "
			+ "The Manager is retrieved from InjectorManager.create (static method) using reflection.";
	protected Manager manager = null;

    private Log log = Log.getInstance(CanDIActionBeanHelper.class);
	
	@SuppressWarnings("unchecked")
	public ResinInjectorFactory(){		
		try{
			Class injectorClass = Class.forName("com.caucho.config.inject.InjectManager");
			this.manager = (Manager)injectorClass.getDeclaredMethod("create").invoke(null);
		} catch (ClassNotFoundException cnfe)
		{ 
			//not a problem, as long as we aren't in resin
		} catch (InvocationTargetException ite) {
			log.error(ite.toString());
		} catch (IllegalAccessException iae) {
			// more of a problem...
			log.error(iae.toString());
		} catch (NoSuchMethodException nsme) {
			// more of a problem...
			log.error(nsme.toString());
		}
	}
	@Override
	public String GetDescription() {
		return DESCRIPTION;
	}

	@Override
	public ActionBean getActionBean(Class<? extends ActionBean> type,
			ActionBeanContext context) {

		return (ActionBean) this.manager.getInstanceByType(type);

	}

	@Override
	public ActionBeanContext getActionBeanContext() {
		return (ActionBeanContext) this.manager.getInstanceByType(ActionBeanContext.class);
	}

	@Override
	public boolean isAvailable() {
		return (this.manager != null);
	}
	
	@Override
	public String toString() {
		return "Resin Injector (" + this.manager == null ? "on"
				: "off" + "): " + DESCRIPTION;
	}
}